#include <QtTest>
#include <QCoreApplication>
#include "../app/colorplot.h"
#include <QTest>
#include <QColor>

// add necessary includes here

/**
 * @brief The test class            Класс для тестирования данных класса ColorPlot
 */
class test : public QObject
{
    Q_OBJECT

public:
    test();
    ~test();

private slots:
    /**
     * @brief initTest              Тест инициализации
     */
    void initTestCase();
    /**
     * @brief cleanupTestCase       Тест очистки
     */
    void cleanupTestCase();
    /**
     * @brief test_case1            Первый набор тестов
     */
    void test_case1();
    /**
     * @brief test_case2            Второй набор тестов
     */
    void test_case2();
    /**
     * @brief test_case3            Третий набор тестов
     */
    void test_case3();
    /**
     * @brief test_case1_data       Данные для первого набора тестов
     */
    void test_case1_data();
    /**
     * @brief test_case2_data       Данные для второго набора тестов
     */
    void test_case2_data();

    /**
     * @brief test_case3_data       Данные для третьего набора тестов
     */
    void test_case3_data();

};

test::test()
{

}

test::~test()
{

}

void test::initTestCase()
{

}

void test::cleanupTestCase()
{

}

void test::test_case1_data()
{
    // Вариант теста в котором создаём экземпляр класса ColorPlot с первым цветом QColor(50,0,50) и далее
    // в test_case1 передаём два цвета: color - цвет кривой или фона полученный соответствующими методами из созданного
    // экземпляра класса и result - ожидаемый цвет. Ожиданмый цвет был получен по формулам.

    ColorPlot colorPlot(QColor(50,0,50));
    QTest::addColumn<QColor>("color");
    QTest::addColumn<QColor>("result");
    QTest::newRow("background_color")<<colorPlot.getBackgroundColor() << QColor(242,241,233);
    QTest::newRow("1_base_color")<<colorPlot.getCurveColor(0) << QColor(50,0,50).toHsv();
    QTest::newRow("1_compl_color")<<colorPlot.getCurveColor(1) << QColor::fromHsv(300,174,170);
    QTest::newRow("2_base_color")<<colorPlot.getCurveColor(2) <<  QColor::fromHsv(30,255,50);
    QTest::newRow("2_compl_color")<<colorPlot.getCurveColor(3) << QColor::fromHsv(30,174,170);
    QTest::newRow("3_base_color")<<colorPlot.getCurveColor(4) << QColor::fromHsv(120,255,50);
    QTest::newRow("3_compl_color")<<colorPlot.getCurveColor(5) << QColor::fromHsv(120,174,170);
    QTest::newRow("4_base_color")<<colorPlot.getCurveColor(6) << QColor::fromHsv(210,255,50);
    QTest::newRow("4_compl_color")<<colorPlot.getCurveColor(7) << QColor::fromHsv(210,174,170);
}

void test::test_case1()
{
    // Вариант теста в котором маркосом QFETCH получаем цвет кривой или фона и ожидаемый цвет. И макросом QCOMPARE проверяется
    // совпадают они или нет.

    QFETCH(QColor,color);
    QFETCH(QColor,result);
    QCOMPARE(color,result);
}

void test::test_case2_data()
{
    // Вариант теста в котором экземпляр класса ColorPlot с первым цветом QColor(200,200,220) создаётся в test_case2_data и далее
    // в test_case2 передаётся два цвета: color - цвет кривой или фона полученный соответствующими методами из созданного
    // экземпляра классаи и result - ожидаемый цвет. Ожиданмый цвет был получен по формулам.

    ColorPlot colorPlot(QColor(200,100,220));
    QTest::addColumn<QColor>("color");
    QTest::addColumn<QColor>("result");
    QTest::newRow("1_base_color") << colorPlot.getCurveColor(0) << QColor::fromHsv(290,139,220);
    QTest::newRow("1_compl_color") << colorPlot.getCurveColor(1) << QColor::fromHsv(290,58,70);
    QTest::newRow("2_base_color") << colorPlot.getCurveColor(2) << QColor::fromHsv(20,139,220);
    QTest::newRow("2_compl_color") << colorPlot.getCurveColor(3) << QColor::fromHsv(20,58,70);
    QTest::newRow("3_base_color") << colorPlot.getCurveColor(4) << QColor::fromHsv(110,139,220);
    QTest::newRow("3_compl_color") << colorPlot.getCurveColor(5) << QColor::fromHsv(110,58,70);
    QTest::newRow("4_base_color") << colorPlot.getCurveColor(6) << QColor::fromHsv(200,139,220);
    QTest::newRow("4_compl_color") << colorPlot.getCurveColor(7) << QColor::fromHsv(200,58,70);
}

void test::test_case2()
{
    // Вариант теста в котором макросом QFETCH мы получаем цвет кривой или фона и ожидаемый цвет. Далее макросом QVERIFY проверяем
    // совпадают они или нет.Тест будет завершён успешно, если условие color==result истенно и прекратит выполнение теста,
    // если входящее условие не истино (false).

    QFETCH(QColor,color);
    QFETCH(QColor,result);
    QVERIFY(color==result);
}

void test::test_case3_data()
{
    ColorPlot colorPlot(QColor(218,209,220));
    QTest::addColumn<QColor>("color");
    QTest::addColumn<QColor>("result");
    QTest::newRow("1_base_color")<< colorPlot.getCurveColor(0) << QColor::fromHsv(289,12,220);
    QTest::newRow("1_compl_color")<< colorPlot.getCurveColor(1) << QColor::fromHsv(289,93,70);
    QTest::newRow("2_base_color")<< colorPlot.getCurveColor(2) << QColor::fromHsv(19,12,220);
    QTest::newRow("2_compl_color")<< colorPlot.getCurveColor(3) << QColor::fromHsv(19,93,70);
    QTest::newRow("3_base_color")<< colorPlot.getCurveColor(4) << QColor::fromHsv(109,12,220);
    QTest::newRow("3_compl_color")<< colorPlot.getCurveColor(5) << QColor::fromHsv(109,93,70);
    QTest::newRow("4_base_color")<< colorPlot.getCurveColor(6) << QColor::fromHsv(199,12,220);
    QTest::newRow("4_compl_color")<< colorPlot.getCurveColor(7) << QColor::fromHsv(199,93,70);
}
void test::test_case3()
{
    // Вариант теста в котором мы в test_case3 создаём экземпляр класса ColorPlot с первым цветом QColor(218,209,220)
    // и макросом QCOMPARE проверяем совпадает ли цвет фона или первой кривой из этого экземпляра класса и ожидаемый цвет, полученный по формулам.

    QFETCH(QColor,color);
    QFETCH(QColor,result);
    QVERIFY2(color==result,"Error! color != result");
}

QTEST_MAIN(test)

#include "tst_test.moc"
